package com.dq.Week3.day13;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * 演示HashSet的基本用法
 *
 * 去重
 * Hashset的特点
 * (1) 没有重复元素
 * (2) 不保留元素的插入顺序
 * (3) 也没有按照元素的大小排序
 *
 * hashcode去重的原理
 * 先判断对象的hashcod是否跟已经存在的某个元素的hashcode相同，如果不同，直接当成不同的元素处理
 * 如果两个元素的hashcode相同，还需要判断两个对象的equals方法是否返回true
 * 两个条件都满足则会当成想跟他的元素进行去重
 *
 * 注意：如果是自定义的类的对象，要想在HashSet中实现去重，需要做两件事情
 * (1) 重写hashcode方法
 * (2) 重写eauals方法
 */
public class HashSetDemo {

    public static void main(String[] args) {

        Student stu1 = new Student("刘晓蕾", 18);
        Student stu2 = new Student("刘晓蕾", 18);

        // stu1的hashcode 和stu2的hashcode是否相同呢
        System.out.println(stu1.hashCode());
        System.out.println(stu2.hashCode());

        System.out.println(stu1.equals(stu2));

        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("张峻豪",19));
        students.add(new Student("程锐",18));
        students.add(stu1);
        students.add(stu2);
        System.out.println(students);

        HashSet<Student> set = new HashSet<>(students);
        System.out.println(set);


//        ArrayList<String> list = new ArrayList<>();
//        list.add("hello");
//        list.add("hello");
//        list.add("hello");
//        list.add("wolrd");
//        System.out.println(list);
//
//        HashSet<String> set = new HashSet<>(list);
//        System.out.println(set);

//        List<Integer> list = new ArrayList<>();
//        list.add(100);
//        list.add(100);
//        list.add(50);
//        list.add(1);
//        System.out.println(list);
//
//        // 创建HashSet时直接给一个集合作为构造参数
//        HashSet<Integer> set = new HashSet<>(list);
//        System.out.println(set);

//        HashSet<Integer> set = new HashSet<>();
//        set.addAll(list);
//        System.out.println(set);
//        set.add(list);


        // 对一个List进行去重操作？
//        List<Integer> list2 =  removeDuplicate(list);
//        System.out.println(list2);

//        HashSet<Integer> set = new HashSet<>();
//        set.add(100);
//        set.add(100);
//        set.add(50);
//        set.add(1);
//        set.add(35);
//        set.add(100);
//        System.out.println(set);

    }

    public static List<Integer> removeDuplicate(List<Integer> list) {

        ArrayList<Integer> result = new ArrayList<>();

        for (Integer integer : list) {
            // 如果元素不再result中，那么放入
            if (!result.contains(integer)) {
                result.add(integer);
            }
        }

        return result;
    }

}